package demo26;


public class T {

    /**
     * 运行结果：
     *
     * 主线程结束
     * 线程t1 start
     * 线程t2 start
     * 线程t2 end
     * 线程t3 start
     * 线程t3 end
     * 线程t4 start
     * 线程t4 end
     * 线程t1 end
     *
     *
     *
     * 1. t1线程开始wait
     * 2. 运行t2线程
     * 3. 运行t3线程，并且调用了notify方法
     * 4. 运行的不是wait线程t1，而是运行了t4线程
     * 5. 轮到t1线程执行了。
     *
     * 所以说明调用了notify只是把wait的线程叫醒了，变成可执行的状态，并不是下一个一定会执行wait的线程
     */
    public static void main(String[] args) {
        Object lock = new Object();
        new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("线程t1 start");
                    lock.wait();
                    System.out.println("线程t1 end");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "t1").start();

        new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程t2 start");
                System.out.println("线程t2 end");

            }
        }, "t2").start();


        new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程t3 start");
                lock.notify();
                System.out.println("线程t3 end");

            }
        }, "t3").start();

        new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程t4 start");
                System.out.println("线程t4 end");

            }
        }, "t4").start();


        System.out.println("主线程结束");

    }
}
